Skip to content

errno 與 gmtime_r ​

errno 的正確用法 ​

  • 函數不會清掉 errno
  • 只有函數回報失敗時(回傳 NULL、-1 等,看文件),errno 才有意義
c
// ❌ 成功時 errno 也可能非 0(內部 open 時區檔失敗但有 fallback)
errno = 0;
gmtime_r(&t, &tm);
if (errno) perror("gmtime_r");

// ✅
if (!gmtime_r(&t, &tm)) perror("gmtime_r");

gmtime_r 的效能 ​

  • gmtime_r 與 localtime_r 共用實作,會呼叫 tzset_internal 讀時區設定並更新全域狀態
  • thread-safe 是靠 lock → 多 thread 頻繁呼叫時大量時間花在 kernel mode
  • 高頻呼叫可以考慮自己算,或用 Boost Posix Time、C++20 <chrono>

參考 ​

頁面歷史

Just observe 👀